/*
 * @Author: Zhengxuan Ye
 * @Date: 2025-05-06 21:28:38
 * @Last Modified by: Zhengxuan Ye
 * @Last Modified time: 2025-05-06 21:28:38
 */

import bcrypt from 'bcryptjs'
import jwt from 'jsonwebtoken'
import { pool } from '../config/db.js'

// 管理员登录
export const adminLogin = async (req, res) => {
  try {
    const { username, password } = req.body

    if (!username || !password) {
      return res.status(400).json({ message: '用户名和密码是必填的' })
    }

    // 查询管理员
    const [admins] = await pool.execute('SELECT * FROM admins WHERE username = ?', [username])

    if (admins.length === 0) {
      return res.status(401).json({ message: '用户名或密码错误' })
    }

    const admin = admins[0]

    // 验证密码
    const isPasswordValid = await bcrypt.compare(password, admin.password)

    if (!isPasswordValid) {
      return res.status(401).json({ message: '用户名或密码错误' })
    }

    // 生成JWT令牌
    const token = jwt.sign(
      { id: admin.id, username: admin.username, isAdmin: true },
      process.env.JWT_SECRET || 'your-secret-key',
      { expiresIn: '24h' },
    )

    // 返回管理员信息和令牌
    res.status(200).json({
      message: '登录成功',
      admin: {
        id: admin.id,
        username: admin.username,
        email: admin.email,
        isAdmin: true,
      },
      token,
    })
  } catch (error) {
    console.error('管理员登录失败:', error)
    res.status(500).json({ message: '服务器错误' })
  }
}

// 验证管理员身份
export const authenticateAdmin = async (req, res, next) => {
  try {
    // 获取请求头中的令牌
    const authHeader = req.headers.authorization
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      return res.status(401).json({ message: '未授权' })
    }

    const token = authHeader.split(' ')[1]

    // 验证令牌
    const decoded = jwt.verify(token, process.env.JWT_SECRET || 'your-secret-key')

    // 检查是否是管理员
    if (!decoded.isAdmin) {
      return res.status(403).json({ message: '没有管理员权限' })
    }

    // 将管理员信息添加到请求对象
    req.admin = decoded

    // 继续下一个中间件
    next()
  } catch (error) {
    console.error('验证管理员身份失败:', error)
    res.status(401).json({ message: '未授权' })
  }
}

// 初始化管理员密码（加密）
export const initAdminPassword = async () => {
  try {
    // 检查是否已经有管理员账号
    const [admins] = await pool.execute('SELECT * FROM admins WHERE username = ?', ['khalilYip'])

    if (admins.length > 0) {
      const admin = admins[0]

      // 检查密码是否已经加密
      try {
        // 尝试解析密码，如果能解析，说明是已加密的
        await bcrypt.compare('test', admin.password)
        console.log('管理员密码已加密，无需初始化')
        return true
      } catch (error) {
        // 密码未加密，需要更新
        console.log('管理员密码未加密，正在更新...')
      }
    } else {
      // 没有管理员账号，创建一个
      console.log('未找到管理员账号，正在创建...')

      // 加密密码
      const hashedPassword = await bcrypt.hash('ya3288426755', 10)

      // 插入管理员账号
      await pool.execute('INSERT INTO admins (username, password, email) VALUES (?, ?, ?)', [
        'khalilYip',
        hashedPassword,
        'admin@example.com',
      ])

      console.log('管理员账号创建成功')
      return true
    }

    // 更新现有管理员密码
    const hashedPassword = await bcrypt.hash('ya3288426755', 10)
    await pool.execute('UPDATE admins SET password = ? WHERE username = ?', [
      hashedPassword,
      'khalilYip',
    ])

    console.log('管理员密码更新成功')
    return true
  } catch (error) {
    console.error('初始化管理员密码失败:', error)
    // 重新抛出错误，这样调用者可以捕获它
    throw error
  }
}
